Title: Happy EasteR! Let’s find some eggs… Date: 2019-04-20 Slug: HappyEasteR Category: posts Tags: R, blog, magick, fun, easter Authors: Jurriaan Nagelkerke Summary: Happy EasteR! Fun example how to use image processing package magick to hide and find easter eggs.
Hi there! Yes, it’s the most Easterful time of the year again. For some of us a sacret time, for others mainly an egg-eating period and some just enjoy the extra day of spare time. In case you have some time available for some good egg searching business, but no-one seems willing to hide them for you this year, here’s an alteRnative. Hide them yourself and have a nice easteR holyday! As you go, you also get to know the very nice image processing package: magick.
Before we can start hiding eggs, we need some scenes…
easterScenes <- c(
'https://www.godupdates.com/wp-content/uploads/2018/03/Easter_LastSupper_GU2018.jpg',
'https://image.cnbcfm.com/api/v1/image/105764024-1551270113306gettyimages-1127697101.jpeg',
'https://images.pexels.com/photos/33152/european-rabbits-bunnies-grass-wildlife.jpg'
)
library(magick)
# read images and put in a vector
images = c(image_read(easterScenes[1]),image_read(easterScenes[2]),image_read(easterScenes[3]))
#show all images, next to eachother
image_append(image_scale(images, "x200"))
…and - obviously - we need some eggs to hide!
easterEggs <- c(
'https://cdn.pixabay.com/photo/2017/02/04/20/28/easter-2038263_960_720.png',
'https://cdn.pixabay.com/photo/2016/12/15/11/41/easter-1908690_960_720.png',
'https://cdn.pixabay.com/photo/2017/03/28/09/56/easter-egg-2181493_960_720.png',
'https://cdn.pixabay.com/photo/2019/01/29/13/49/egg-3962420_960_720.png',
'https://cdn.pixabay.com/photo/2018/02/25/09/44/easter-3180067_960_720.png'
)
# read images and put in a vector
images = c(image_trim(image_read(easterEggs[1])),image_trim(image_read(easterEggs[2])),
image_trim(image_read(easterEggs[3])),
image_trim(image_read(easterEggs[4])),image_trim(image_read(easterEggs[5])))
#show all images, next to eachother
image_append(image_scale(images,"x100"))
Excellent, we have some scenes and some eggs, let’s create a function to make hiding our eggs easy. We’ll take advantage of some other functions from the great image processing package magick.
library(magick)
library(dplyr)
hideEggs <- function(sceneUrl,nEggs=nEggs,eggPositions,eggSize=0.04){
# read scene
easterScene <- image_read(sceneUrl)
# resize picture to 800 width (keep aspect ratio)
easterScene <- image_scale(easterScene, "800x")
sceneWidth <- as.numeric(image_info(easterScene)['width'])
sceneHeight <- as.numeric(image_info(easterScene)['height'])
# collect some eggs (sample with replacement in the basket ;))
nEggs = nEggs
eggUrls = sample(easterEggs,nEggs,replace = TRUE)
easterSceneEggs <- easterScene
for (eggn in 1:nEggs){
eggUrl = eggUrls[eggn]
# get egg, resize, rotate and put on canvas!
egg <- image_read(eggUrl)
# resize egg to 5% of canvas height (keep aspect ratio)
egg <- image_scale(egg,paste0("x",round(eggSize*sceneWidth)))
# remove background
egg <- image_background(egg,"none")
# rotate egg between -90 and 90 degrees
eggRotation <- runif(1,-90,90)
egg <- image_rotate(egg,eggRotation)
#set x and y position (as specified in list or else random)
if (!missing(eggPositions)){
xpos <- eggPositions[[eggn]][1]*sceneWidth
} else {
xpos <- runif(1,0,sceneWidth)
}
if (!missing(eggPositions)){
ypos <- eggPositions[[eggn]][2]*sceneHeight
} else {
ypos <- runif(1,0,sceneHeight)
}
#add egg to canvas
easterSceneEggs <- image_composite(easterSceneEggs, egg, offset = paste0("+",xpos,"+",ypos))
}
return(easterSceneEggs)
}
Yeah, we’ve hidden 5 eggs near these happy easter bunnies. Can you spot them in a few seconds??
# let's hide 5 eggs among our easter bunnies
hideEggs(sceneUrl = easterScenes[2],nEggs = 5)
These guys also seem to enjoy our little game. Finally, let’s make a somewhat more challenging version, you can share it with your relatives, wishing them a nice easter holiday.
# think where to hide...
eggPositions = list(c(0.1,0.95),c(0.03,0.6),c(0.4,0.65),c(0.5,0.67),c(0.465,0.31),
c(0.6,0.4),c(0.7,0.7),c(0.6,0.66),c(0.8,0.94),c(0.97,0.71))
#... and hide! we'll use smaller eggs to make it a bit more challenging.
easterCard <- hideEggs(sceneUrl = easterScenes[1],nEggs = length(eggPositions),
eggPositions = eggPositions,
eggSize = 0.02)
# let's add some wishes to our easter card...
easterCard %>%
image_annotate("Happy Easter!!!", size = 36, color = "yellow", location = "+270+16") %>%
image_annotate("Can you spot the 10 hidden eggs?", size = 18, color = "white", location = "+250+60")
In case your audience can’t figure out where you hid the eggs, magick lets you animate your pictures, so:
# specify easterScene with and without the eggs and specify number of frames
frames <- image_morph(c(easterCard, image_scale(image_read(easterScenes[1]),"800x")), frames = 10)
image_animate(frames)
For much more you can do with magick, see the vignette.
That’s it, have yourself a merry little easter egg!